راهنمای جامع اینترفیسها و تایپها در TypeScript، بررسی تفاوتها، موارد استفاده و بهترین شیوهها برای ساخت اپلیکیشنهای قابل نگهداری و مقیاسپذیر در سراسر جهان.
اینترفیس (Interface) در مقابل تایپ (Type) در TypeScript: بهترین شیوههای تعریف برای توسعهدهندگان جهانی
تایپاسکریپت (TypeScript)، که یک ابرمجموعه از جاوااسکریپت است، توسعهدهندگان را در سراسر جهان قادر میسازد تا از طریق تایپ ایستا (static typing)، اپلیکیشنهای قوی و مقیاسپذیر بسازند. دو ساختار اساسی برای تعریف انواع، اینترفیسها (Interfaces) و تایپها (Types) هستند. اگرچه شباهتهایی دارند، اما درک تفاوتهای ظریف و موارد استفاده مناسب آنها برای نوشتن کدی تمیز، قابل نگهداری و کارآمد حیاتی است. این راهنمای جامع به بررسی تفاوتهای بین اینترفیسها و تایپها در TypeScript میپردازد و بهترین شیوهها برای استفاده مؤثر از آنها در پروژههایتان را بررسی میکند.
درک اینترفیسها در TypeScript
یک اینترفیس (Interface) در TypeScript روشی قدرتمند برای تعریف یک قرارداد برای یک شیء است. اینترفیس شکل یک شیء را مشخص میکند و ویژگیهایی که باید داشته باشد، انواع دادهای آنها و به صورت اختیاری، متدهایی که باید پیادهسازی کند را تعیین میکند. اینترفیسها عمدتاً ساختار اشیاء را توصیف میکنند.
سینتکس و مثال اینترفیس
سینتکس تعریف یک اینترفیس ساده است:
interface User {
id: number;
name: string;
email: string;
isActive: boolean;
}
const user: User = {
id: 123,
name: "Alice Smith",
email: "alice.smith@example.com",
isActive: true,
};
در این مثال، اینترفیس User
ساختار یک شیء کاربر را تعریف میکند. هر شیئی که به متغیر user
اختصاص داده شود باید از این ساختار پیروی کند؛ در غیر این صورت، کامپایلر TypeScript خطا ایجاد میکند.
ویژگیهای کلیدی اینترفیسها
- تعریف شکل شیء: اینترفیسها در تعریف ساختار یا «شکل» اشیاء عالی عمل میکنند.
- قابلیت توسعه: اینترفیسها را میتوان به راحتی با استفاده از کلمه کلیدی
extends
گسترش داد، که امکان ارثبری و استفاده مجدد از کد را فراهم میکند. - ادغام تعاریف (Declaration Merging): تایپاسکریپت از ادغام تعاریف برای اینترفیسها پشتیبانی میکند، به این معنی که میتوانید یک اینترفیس را چندین بار تعریف کنید و کامپایلر آنها را در یک تعریف واحد ادغام میکند.
مثال ادغام تعاریف
interface Window {
title: string;
}
interface Window {
height: number;
width: number;
}
const myWindow: Window = {
title: "My Application",
height: 800,
width: 600,
};
در اینجا، اینترفیس Window
دو بار تعریف شده است. تایپاسکریپت این تعاریف را ادغام میکند و عملاً یک اینترفیس با ویژگیهای title
، height
و width
ایجاد میکند.
بررسی تایپها در TypeScript
یک تایپ (Type) در TypeScript راهی برای تعریف شکل دادهها فراهم میکند. برخلاف اینترفیسها، تایپها تطبیقپذیرتر هستند و میتوانند طیف گستردهتری از ساختارهای داده، از جمله انواع اولیه، اجتماعها (unions)، اشتراکها (intersections) و تاپلها (tuples) را نمایندگی کنند.
سینتکس و مثال تایپ
سینتکس تعریف یک نام مستعار برای تایپ (type alias) به شرح زیر است:
type Point = {
x: number;
y: number;
};
const origin: Point = {
x: 0,
y: 0,
};
در این مثال، تایپ Point
ساختار یک شیء نقطه با مختصات x
و y
را تعریف میکند.
ویژگیهای کلیدی تایپها
- تایپهای اجتماع (Union Types): تایپها میتوانند اجتماعی از چندین تایپ باشند، که به یک متغیر اجازه میدهد مقادیری از انواع مختلف را نگهداری کند.
- تایپهای اشتراک (Intersection Types): تایپها همچنین میتوانند اشتراکی از چندین تایپ باشند و ویژگیهای همه تایپها را در یک تایپ واحد ترکیب کنند.
- تایپهای اولیه (Primitive Types): تایپها میتوانند به طور مستقیم انواع اولیه مانند
string
،number
،boolean
و غیره را نمایندگی کنند. - تاپلها (Tuple Types): تایپها میتوانند تاپلها را تعریف کنند، که آرایههایی با طول ثابت و انواع مشخص برای هر عنصر هستند.
- تطبیقپذیری بیشتر: میتوانند تقریباً هر چیزی را توصیف کنند، از انواع داده اولیه گرفته تا اشکال پیچیده اشیاء.
مثال تایپ اجتماع
type Result = {
success: true;
data: any;
} | {
success: false;
error: string;
};
const successResult: Result = {
success: true,
data: { message: "Operation successful!" },
};
const errorResult: Result = {
success: false,
error: "An error occurred.",
};
تایپ Result
یک تایپ اجتماع است که میتواند یا یک موفقیت با داده باشد یا یک شکست با پیام خطا. این برای نمایش نتیجه عملیاتی که ممکن است موفق یا ناموفق باشند، مفید است.
مثال تایپ اشتراک
type Person = {
name: string;
age: number;
};
type Employee = {
employeeId: string;
department: string;
};
type EmployeePerson = Person & Employee;
const employee: EmployeePerson = {
name: "Bob Johnson",
age: 35,
employeeId: "EMP123",
department: "Engineering",
};
تایپ EmployeePerson
یک تایپ اشتراک است که ویژگیهای هر دو تایپ Person
و Employee
را ترکیب میکند. این به شما امکان میدهد با ترکیب تایپهای موجود، تایپهای جدیدی ایجاد کنید.
تفاوتهای کلیدی: اینترفیس در مقابل تایپ
اگرچه هم اینترفیسها و هم تایپها برای تعریف ساختارهای داده در TypeScript به کار میروند، اما تفاوتهای کلیدی وجود دارد که بر زمان استفاده از یکی به جای دیگری تأثیر میگذارد:
- ادغام تعاریف: اینترفیسها از ادغام تعاریف پشتیبانی میکنند، در حالی که تایپها این کار را نمیکنند. اگر نیاز به گسترش یک تعریف تایپ در چندین فایل یا ماژول دارید، اینترفیسها عموماً ترجیح داده میشوند.
- تایپهای اجتماع: تایپها میتوانند تایپهای اجتماع را نمایندگی کنند، در حالی که اینترفیسها نمیتوانند به طور مستقیم اجتماعها را تعریف کنند. اگر نیاز به تعریف یک تایپ دارید که میتواند یکی از چندین نوع مختلف باشد، از یک نام مستعار تایپ استفاده کنید.
- تایپهای اشتراک: تایپها میتوانند با استفاده از عملگر
&
تایپهای اشتراک ایجاد کنند. اینترفیسها میتوانند اینترفیسهای دیگر را گسترش دهند و به اثری مشابه دست یابند، اما تایپهای اشتراک انعطافپذیری بیشتری ارائه میدهند. - تایپهای اولیه: تایپها میتوانند به طور مستقیم انواع اولیه (رشته، عدد، بولین) را نمایندگی کنند، در حالی که اینترفیسها عمدتاً برای تعریف اشکال اشیاء طراحی شدهاند.
- پیامهای خطا: برخی از توسعهدهندگان معتقدند که اینترفیسها پیامهای خطای کمی واضحتری نسبت به تایپها ارائه میدهند، به ویژه هنگام کار با ساختارهای تایپ پیچیده.
بهترین شیوهها: انتخاب بین اینترفیس و تایپ
انتخاب بین اینترفیسها و تایپها به نیازهای خاص پروژه و ترجیحات شخصی شما بستگی دارد. در اینجا چند دستورالعمل کلی برای در نظر گرفتن وجود دارد:
- برای تعریف شکل اشیاء از اینترفیسها استفاده کنید: اگر عمدتاً نیاز به تعریف ساختار اشیاء دارید، اینترفیسها انتخابی طبیعی هستند. قابلیت توسعه و ادغام تعاریف آنها میتواند در پروژههای بزرگتر مفید باشد.
- برای تایپهای اجتماع، اشتراک و انواع اولیه از تایپها استفاده کنید: هنگامی که نیاز به نمایش یک اجتماع از تایپها، یک اشتراک از تایپها یا یک تایپ اولیه ساده دارید، از یک نام مستعار تایپ استفاده کنید.
- سازگاری را در پایگاه کد خود حفظ کنید: صرف نظر از اینکه اینترفیسها یا تایپها را انتخاب میکنید، برای سازگاری در سراسر پروژه خود تلاش کنید. استفاده از یک سبک ثابت، خوانایی و قابلیت نگهداری کد را بهبود میبخشد.
- ادغام تعاریف را در نظر بگیرید: اگر پیشبینی میکنید که نیاز به گسترش یک تعریف تایپ در چندین فایل یا ماژول دارید، اینترفیسها به دلیل ویژگی ادغام تعاریف، انتخاب بهتری هستند.
- برای APIهای عمومی اینترفیسها را ترجیح دهید: هنگام طراحی APIهای عمومی، اینترفیسها اغلب ترجیح داده میشوند زیرا قابلیت توسعه بیشتری دارند و به مصرفکنندگان API شما اجازه میدهند به راحتی تایپهایی که تعریف کردهاید را گسترش دهند.
مثالهای عملی: سناریوهای اپلیکیشن جهانی
بیایید چند مثال عملی را برای نشان دادن چگونگی استفاده از اینترفیسها و تایپها در یک اپلیکیشن جهانی در نظر بگیریم:
۱. مدیریت پروفایل کاربر (بینالمللیسازی)
فرض کنید در حال ساخت یک سیستم مدیریت پروفایل کاربر هستید که از چندین زبان پشتیبانی میکند. میتوانید از اینترفیسها برای تعریف ساختار پروفایلهای کاربری و از تایپها برای نمایش کدهای زبانهای مختلف استفاده کنید:
interface UserProfile {
id: number;
name: string;
email: string;
preferredLanguage: LanguageCode;
address: Address;
}
interface Address {
street: string;
city: string;
country: string;
postalCode: string;
}
type LanguageCode = "en" | "fr" | "es" | "de" | "zh"; // کدهای زبان نمونه
const userProfile: UserProfile = {
id: 1,
name: "John Doe",
email: "john.doe@example.com",
preferredLanguage: "en",
address: { street: "123 Main St", city: "Anytown", country: "USA", postalCode: "12345" }
};
در اینجا، اینترفیس UserProfile
ساختار یک پروفایل کاربر، از جمله زبان ترجیحی او را تعریف میکند. تایپ LanguageCode
یک تایپ اجتماع است که زبانهای پشتیبانی شده را نمایندگی میکند. اینترفیس Address
فرمت آدرس را با فرض یک فرمت عمومی جهانی تعریف میکند.
۲. تبدیل ارز (جهانیسازی)
یک اپلیکیشن تبدیل ارز را در نظر بگیرید که نیاز به مدیریت ارزهای مختلف و نرخهای تبدیل دارد. میتوانید از اینترفیسها برای تعریف ساختار اشیاء ارز و از تایپها برای نمایش کدهای ارز استفاده کنید:
interface Currency {
code: CurrencyCode;
name: string;
symbol: string;
}
interface ExchangeRate {
baseCurrency: CurrencyCode;
targetCurrency: CurrencyCode;
rate: number;
}
type CurrencyCode = "USD" | "EUR" | "GBP" | "JPY" | "CAD"; // کدهای ارز نمونه
const usd: Currency = {
code: "USD",
name: "United States Dollar",
symbol: "$",
};
const exchangeRate: ExchangeRate = {
baseCurrency: "USD",
targetCurrency: "EUR",
rate: 0.85,
};
اینترفیس Currency
ساختار یک شیء ارز، از جمله کد، نام و نماد آن را تعریف میکند. تایپ CurrencyCode
یک تایپ اجتماع است که کدهای ارز پشتیبانی شده را نمایندگی میکند. اینترفیس ExchangeRate
برای نمایش نرخهای تبدیل بین ارزهای مختلف استفاده میشود.
۳. اعتبارسنجی دادهها (فرمت بینالمللی)
هنگام مدیریت دادههای ورودی از کاربران در کشورهای مختلف، مهم است که دادهها را مطابق با فرمت بینالمللی صحیح اعتبارسنجی کنید. به عنوان مثال، شماره تلفنها بر اساس کد کشور فرمتهای متفاوتی دارند. از تایپها میتوان برای نمایش این تفاوتها استفاده کرد.
type PhoneNumber = {
countryCode: string;
number: string;
isValid: boolean; // یک بولین برای نمایش داده معتبر/نامعتبر اضافه کنید.
};
interface Contact {
name: string;
phoneNumber: PhoneNumber;
email: string;
}
function validatePhoneNumber(phoneNumber: string, countryCode: string): PhoneNumber {
// منطق اعتبارسنجی بر اساس کد کشور (مثلاً با استفاده از کتابخانهای مانند libphonenumber-js)
// ... پیادهسازی برای اعتبارسنجی شماره در اینجا قرار میگیرد.
const isValid = true; //مقدار موقت
return { countryCode, number: phoneNumber, isValid };
}
const contact: Contact = {
name: "Jane Doe",
phoneNumber: validatePhoneNumber("555-123-4567", "US"), //مثال
email: "jane.doe@email.com",
};
console.log(contact.phoneNumber.isValid); //خروجی بررسی اعتبارسنجی.
نتیجهگیری: تسلط بر تعاریف TypeScript
اینترفیسها و تایپهای TypeScript ابزارهای قدرتمندی برای تعریف ساختارهای داده و افزایش کیفیت کد هستند. درک تفاوتهای آنها و استفاده مؤثر از آنها برای ساخت اپلیکیشنهای قوی، قابل نگهداری و مقیاسپذیر ضروری است. با پیروی از بهترین شیوههای ذکر شده در این راهنما، میتوانید تصمیمات آگاهانهای در مورد زمان استفاده از اینترفیسها و تایپها بگیرید و در نهایت، گردش کار توسعه TypeScript خود را بهبود بخشیده و به موفقیت پروژههای خود کمک کنید.
به یاد داشته باشید که انتخاب بین اینترفیسها و تایپها اغلب یک موضوع ترجیح شخصی و نیازمندیهای پروژه است. هر دو رویکرد را آزمایش کنید تا ببینید چه چیزی برای شما و تیمتان بهتر عمل میکند. پذیرش قدرت سیستم تایپ TypeScript بدون شک به کدی قابل اعتمادتر و قابل نگهداریتر منجر خواهد شد که به نفع توسعهدهندگان در سراسر جهان است.